#include "CYCTIMER.h"

CYCTIMER_T* CYCTIMER_t;



//************************************
// Method:    	CALCU_SAMA						//< SAMA运算函数
// Programmer:  lww
// Time:		2018/11/16
// Returns:   	bool							//< 成功：true；失败：false
// Parameter: 	Model_Base_t * arg				//< 模块参数结构体指针
// Parameter: 	float dt						//< 运算周期
// Parameter: 	bool * DI						//< 数字量输入值数组指针
// Parameter: 	bool * DO						//< 数字量输出值数组指针
// Parameter: 	bool * AI						//< 模拟量输入值数组指针
// Parameter: 	bool * AO						//< 模拟量输出值数组指针
//************************************
bool CALCU_SAMA(CYCTIMER)(Model_Base_t* arg, float dt, bool* DI, bool* DO, float* AI, float* AO)
{
	/****************变量定义区开始**************/
	/*<<<<<定义输入变量>>>>>*/
	bool Enable;				//< 使能信号
	/*<<<<<<<<<<<<<<<<<<<<<<*/

	/*<<<<<定义输出变量>>>>>*/
	bool Output_Value;			//< 输出值
	/*<<<<<<<<<<<<<<<<<<<<<<*/

	/*<<<<<定义参数变量>>>>>*/
	int Month;					//< 月
	int Day;					//< 日
	int Hour;					//< 时
	int Minute;					//< 分
	int Second;					//< 秒
	/*<<<<<<<<<<<<<<<<<<<<<<*/
	struct timespec ts;
	struct tm ptm_Now;			//< 当前时间
	bool SetTime_Come = true;	//< 设定时间到来标志
	/****************变量定义区结束**************/

	NAME(CYCTIMER)* Obj = (NAME(CYCTIMER)*)arg;

	/****************变量赋值**************/
	/*<<<<<输入变量赋值>>>>>*/
	Enable = DI[0];
	/*<<<<<<<<<<<<<<<<<<<<<<*/

	/*<<<<<参数变量赋值>>>>>*/
	Month = Obj->Par.Month;
	Day = Obj->Par.Day;
	Hour = Obj->Par.Hour;
	Minute = Obj->Par.Minute;
	Second = Obj->Par.Second;
	/*<<<<<<<<<<<<<<<<<<<<<<*/
	/**************变量赋值结束************/

	/********************************************/
	/**************算法功能实现开始**************/
	/********************************************/
	if (Enable == false)
	{
		Output_Value = false;
	}
	else
	{
		ts = RealTime_Get();					//< 获取当前的实时时间，存放在ts中	duan0831 UTC：世界标准时间
		ts.tv_sec += 28800;						//< duan0830 将世界标准时间转换成北京时间
		ptm_Now = *gmtime(&(ts.tv_sec));		//< 将这个秒数转化为存放年月日信息的结构体

		if (((Month != -1) && (ptm_Now.tm_mon + 1 != Month)) ||
			((Day != -1) && (ptm_Now.tm_mday != Day)) ||
			((Hour != -1) && (ptm_Now.tm_hour != Hour)) ||
			((Minute != -1) && (ptm_Now.tm_min != Minute)) ||
			(ptm_Now.tm_sec != Second))
			SetTime_Come = false;
		
		if (SetTime_Come)
			Output_Value = true;
		else
			Output_Value = false;
	}
	/********************************************/
	/**************算法功能实现结束**************/
	/********************************************/	

	/****************运算结果输出**************/
	DO[0] = Output_Value;
	/**************运算结果输出完毕************/
	return true;
}



//************************************
// Method:    	BCPARA							//< 广播SAMA参数变量函数（无参数需要广播的模块直接将BCPara函数设置为NULL即可）
// Programmer:  lww
// Time:		2018/11/16
// Returns:   	int								//< 成功：返回打包字节个数；失败：返回0
// Parameter: 	Model_Base_t * arg				//< 模块参数结构体指针
// Parameter: 	void ** Data					//< 广播SAMA参数的数据包的指针
//************************************
int BC_PARA(CYCTIMER)(Model_Base_t* arg, void** Data)
{
	NAME(CYCTIMER)* Obj = (NAME(CYCTIMER)*)arg;
	BC_PARA_PUBLIC(Obj);
	return 0;
}



//************************************
// Method:    	CHANGE_PAR				//< 在线修改模块参数函数
// Programmer:  lww
// Time:		2018/11/16
// Returns:   	int						//< 读取字节长度计数值
// Parameter: 	Model_Base_t* arg		//< 指定模块类型链表的指针
// Parameter: 	void** Data				//< 存放数据包当前指针位置的地址
//************************************
int CHANGE_PAR(CYCTIMER)(Model_Base_t* arg, void** Data)
{
	int _iLen = 0;
	MEMREAD(((NAME(CYCTIMER)*)arg)->Par, Data[0]);
	return _iLen;
}
